/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
         http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"

#include "引擎配置.h"
#include "ui矢量数据部件.h"
#include "../ui绘制模板.h"



/*static void f_改变选项绘制(C_枚举表* box) {
	S_PropValueEnum& e = *((S_PropValueEnum*)box->m_属性数据.m_Value);

	auto* self = box->m_子部件[box->m_前一个选项];
	box->m_背景绘制.f_setColor(box->m_前一个选项, self->m_颜色A);

	box->m_背景绘制.f_setColor(e.m_当前选项, self->m_颜色C);
	box->m_前一个选项 = e.m_当前选项;

	if (box->m_属性数据.m_UI->m_Update) {
		box->m_属性数据.m_UI->m_Update(box->m_属性数据);
	}
}*/

/*void on_枚举表属性改变(S_Props& prop) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(prop.m_UI->m_部件);
	f_改变选项绘制(box);
}*/



static bool on_枚举表鼠标进入(C_Widget* self, const S_鼠标& 轮值) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self->m_父部件);
	auto& 当前选项 = f_prop_enum(box->m_属性数据);
	if (self->m_实例ID != 当前选项) {
		box->m_背景绘制.f_setColor(self->m_实例ID, self->m_颜色B);
	}
	return true;
}

static bool on_枚举表鼠标退出(C_Widget* self, const S_鼠标& 轮值) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self->m_父部件);
	auto& 当前选项 = f_prop_enum(box->m_属性数据);
	if (self->m_实例ID != 当前选项) {
		box->m_背景绘制.f_setColor(self->m_实例ID, self->m_颜色A);
	}
	return true;
}

static bool f_枚举表_鼠标点击(C_Widget* self, const E_鼠标按钮& 按钮) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self->m_父部件);
	
	auto& 当前选项 = f_prop_enum(box->m_属性数据);
	box->m_背景绘制.f_setColor(当前选项, self->m_颜色A);

	当前选项 = self->m_实例ID;
	box->m_前一个选项 = 当前选项;
	box->m_背景绘制.f_setColor(self->m_实例ID, self->m_颜色C);

	if (box->m_属性数据.m_UI->m_Update) {
		box->m_属性数据.m_UI->m_Update(box->m_属性数据);
	}
	f_prop_enum(box->m_属性数据) = 当前选项;

	if (box->m_属性数据.m_GPU缓存[0].m_Mem.m_大小) {
		f_buf_I32_at(box->m_属性数据.m_GPU缓存[0], 0) = 当前选项;
	}

	box->m_绘制属性更新 = true;
	return true;
}


static void on_枚举表布局(C_Widget* self, C_Widget** w, uint32 num) {
	if (!num) return;

	C_枚举表* list = (C_枚举表*)self;
	//vec2 size = self->m_Size;

	if (list->m_方向 == E_方向::e_横向) {
		f_HBOX布局({}, self->m_Size, w, num);
	}
	else {
		f_VBOX布局({}, self->m_Size, w, num);
	}
}

static void on_枚举表Draw(C_Widget* self, S_2D画布* 画布) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self);
	auto e = f_prop_enum(box->m_属性数据);

	box->m_背景绘制.m_属性 = f_vg_gen属性(画布);
	
	S_凸边图元 图元 = {};
	图元.属性 = f_vg_get属性指针(画布, box->m_背景绘制.m_属性);
	
	box->m_背景绘制.f_Draw(画布, 图元, E_笔刷类型::e_单色填充);

	auto 字体 = f_surface_get字体(*self->m_UIctx, S_UI主题::ui_默认字体);
	box->m_文本绘制.f_Draw(画布, &字体, box->m_背景绘制.m_属性);
	box->m_图标绘制.f_Draw单色(画布, box->m_背景绘制.m_属性, S_UI主题::ui_默认图标);
}

static void on_枚举表变换修改(C_Widget* self) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self);
	
	auto e = f_prop_enumItem(box->m_属性数据);
	auto ws = self->f_get更新部件();
	//return;
	
	box->m_背景绘制.f_alloc(box->m_属性数据.m_值元素个数);
	box->m_文本绘制.f_alloc(box->m_属性数据.m_值元素个数, 24);
	box->m_图标绘制.f_alloc(box->m_属性数据.m_值元素个数);

	mat3X2 Mat;
	for (uint32 i = 0; i < box->m_属性数据.m_值元素个数; ++i) {
		Mat.row0 = ws.m_W[i]->m_Pos;
		Mat.row1 = ws.m_W[i]->m_Size;
		Mat.row2 = { S_UI主题::ui_面板圆角半径, 0 };
		box->m_背景绘制.f_set单色填充(i, Mat, box->m_颜色A, ws.m_W[i]->m_图元);

		if (box->m_是否绘制标题) {
			box->m_文本绘制.f_居中绘制文本({ Mat.row0 , Mat.row1 }, S_UI主题::uic_文字颜色, i, e.m_Names[i]);
		}
		else {
			box->m_文本绘制.f_居中绘制文本({}, S_UI主题::uic_文字颜色, i, L"");
		}

		auto& ico = e.m_ICO[i];
		Mat.row0 = ws.m_W[i]->m_Pos + ws.m_W[i]->m_Size.y * 0.5f;
		Mat.row1.x = ws.m_W[i]->m_Size.y * 0.8f;
		box->m_图标绘制.f_set(e.m_ICO[i], i, Mat, S_UI主题::uic_文字颜色);
	}
	//box->m_图标绘制.f_End();

	uint32 offset = f_prop_enum(box->m_属性数据);
	box->m_背景绘制.f_setColor(offset, S_UI主题::uic_菜单焦点色);
}


C_枚举表::C_枚举表(S_UI创建环境& ctx, S_Props& prop, bool 是否展开, E_方向 方向) : C_Widget(&ctx) {
	m_前一个选项 = 0;
	m_属性数据 = prop;

	mf_项改变回调 = nullptr;
	mf_项绘制更新 = nullptr;

	mf_布局Fun = on_枚举表布局;
	mf_DrawFun = on_枚举表Draw;
	mf_变换修改 = on_枚举表变换修改;

	m_方向 = 方向;
	m_是否绘制图标 = false;
	m_是否绘制标题 = true;

	
	
	f_重置项(prop);

	m_颜色A = S_UI主题::uic_按钮;
	m_颜色B = S_UI主题::uic_按钮焦点;
	m_颜色C = S_UI主题::uic_菜单焦点色;
}

C_枚举表::~C_枚举表() {
}

void C_枚举表::f_重置项(S_Props& prop) {
	auto e = f_get更新部件();
	S_PropValueEnum 枚举 = *((S_PropValueEnum*)prop.m_Value);
	//uint32 num = prop.m_值元素个数;
	m_属性数据 = prop;

	if (prop.m_值元素个数 > e.m_Num) {
		for (uint8 i = e.m_Num; i < prop.m_值元素个数; ++i) {
			C_Widget* w = new C_Widget();
			w->m_实例ID = i;
			w->m_是否延展 = { true, true };
			w->m_间隔宽度 = 2;

			w->mf_鼠标按键点击 = f_枚举表_鼠标点击;
			w->mf_鼠标进入 = on_枚举表鼠标进入;
			w->mf_鼠标离开 = on_枚举表鼠标退出;

			w->m_颜色A = S_UI主题::uic_按钮;
			w->m_颜色B = S_UI主题::uic_按钮焦点;
			w->m_颜色C = S_UI主题::uic_菜单焦点色;
			w->m_图元 = S_Widget预设图元::m_矩形;

			f_添加子组件(w);
		}
	}
	else {
		f_widget_remove子部件(this, prop.m_值元素个数);
	}


	
	prop.m_UI->m_部件 = this;

	e = f_get更新部件();
	if (prop.m_值元素个数 == 1) {
		e.m_W[0]->m_图元 = S_Widget预设图元::m_圆角矩形;
	}
	else {
		if (m_方向 == E_方向::e_纵向) {
			e.m_W[0]->m_图元 = S_Widget预设图元::m_上圆角矩形;
			e.m_W[e.m_Num - 1]->m_图元 = S_Widget预设图元::m_下圆角矩形;
		}
		else {
			e.m_W[0]->m_图元 = S_Widget预设图元::m_左圆角矩形;
			e.m_W[e.m_Num - 1]->m_图元 = S_Widget预设图元::m_右圆角矩形;
		}
	}
}

void f_ui_关联枚举组件绘制颜色(C_枚举表* self, C_枚举表* 分身) {
	//auto& e = self->m_画布->m_surf[self->m_背景绘制.m_图元.层];
	f_vg_关联凸边形颜色属性(self->m_画布, 分身->m_画布, self->m_背景绘制.m_图元.层);

	if (分身->m_背景绘制.m_图元.链接颜色) {

	}
	else {
		分身->m_背景绘制.m_图元.颜色 = self->m_背景绘制.m_图元.颜色;
	}
}


C_Widget* f_ui_创建枚举选择框(S_UI创建环境& ctx, S_Props& prop, E_方向 方向) {
	C_Widget* w = nullptr;
	if (E_值类型::e_Type_Enum == prop.m_Type) {
		w = new C_枚举表(ctx, prop, true, 方向);
	}
	return w;
}

void f_ui_set枚举选择框(C_Widget* self, E_方向 方向) {
	dynamic_cast<C_枚举表*>(self)->m_方向 = 方向;
}

void f_ui_set枚举选择框图标和文字是否绘制(C_Widget* self, bool 是否绘制图标, bool 是否绘制标题) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self);
	box->m_是否绘制图标 = 是否绘制图标;
	box->m_是否绘制标题 = 是否绘制标题;
}

ubvec2 f_ui_get枚举表当前值(C_Widget* self) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self);
	return { uint8(f_prop_enum(box->m_属性数据)), box->m_前一个选项 };
}

uint8 f_ui_get枚举表项ID(C_Widget* self, uint8 子部件ID, bool 排除激活项) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self);

	if (排除激活项) {
		if (子部件ID == f_prop_enum(box->m_属性数据)) {
			return 255;
		}
		else if (子部件ID + 1 >= box->m_属性数据.m_值元素个数) {
			return 254;
		}
	}
	else {
		if (子部件ID + 1 >= box->m_属性数据.m_值元素个数) {
			return 254;
		}
	}

	return 子部件ID;
}

bool f_ui_get枚举表是否为激活项(C_Widget* self, uint8 项ID) {
	C_枚举表* box = dynamic_cast<C_枚举表*>(self);
	if (f_prop_enum(box->m_属性数据) == 项ID) return true;
	return false;
}

void f_ui_bind枚举部件属性(C_Widget* w, S_Props& prop) {
	auto* 部件 = dynamic_cast<C_枚举表*>(w);
	if (部件) {
		部件->f_重置项(prop);
	}
}

void f_ui_映射枚举组件绘制颜色(C_Widget* self, C_Widget* 分身) {
	auto 主 = dynamic_cast<C_枚举表*>(self);
	auto 副 = dynamic_cast<C_枚举表*>(分身);
	assert(主);
	assert(副);

	f_widget_关联组件(self, 分身);
	f_ui_关联枚举组件绘制颜色(主, 副);

}










